﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace ProjectM2Work
{
    public partial class LongTextblock : Control
    {
        public StackPanel MainElement = new StackPanel();
        private string _text;

        public string Text
        {
            get { return _text; }
            set
            {
                _text = value;
                ParseText(value);
            }
        }

        public LongTextblock()
        {
        }


        private void ParseText(string value)
        {
            MainElement.Children.Clear();

            int maxTexCount = GetMaxTextSize();

            if (value.Length < maxTexCount)
            {
                TextBlock textBlock = CreateTextBlock();
                textBlock.Text = value;
                MainElement.Children.Add(textBlock);
            }
            else
            {
                int n = value.Length / maxTexCount;
                int start = 0;

                // cắt ra từng texblock cho mỗi đoạn ứng với maxCount
                for (int i = 0; i < n; i++)
                {
                    TextBlock textBlock = CreateTextBlock();
                    textBlock.Text = value.Substring(start, maxTexCount);
                    MainElement.Children.Add(textBlock);
                    start = maxTexCount + start;
                }
                // cắt phần còn lại..
                if (value.Length % maxTexCount > 0)
                {
                    TextBlock textBlock = CreateTextBlock();
                    textBlock.Text = value.Substring(
                        maxTexCount * n,
                        value.Length - maxTexCount * n);
                    MainElement.Children.Add(textBlock);
                }
            }
        }

        // Tạo ra 1 textblock mới
        private TextBlock CreateTextBlock()
        {
            TextBlock textBlock = new TextBlock();
            textBlock.Height = double.NaN;
            textBlock.TextWrapping = TextWrapping.Wrap;
            textBlock.FontSize = this.FontSize;
            textBlock.FontFamily = this.FontFamily;
            textBlock.FontWeight = this.FontWeight;
            textBlock.Foreground = this.Foreground;
            return textBlock;
        }

        // đo độ dài chính xác của 1 chữ cái trong Texblock 
        private Size MeasureText(string value)
        {
            TextBlock textBlock = CreateTextBlock();
            textBlock.Text = value;
            return new Size(textBlock.ActualWidth, textBlock.ActualHeight);
        }

        // đếm số lượng dòng và kí tự có thể chứ trong 1 texblock
        // mà không làm cho textblock đó tràn dữ liệu.
        // trong hàm này cần quan tâm biến maxWidth
        private int GetMaxTextSize()
        {
            int maxWidth = 280;

            Size size = this.MeasureText(" ");
            int charLineCount = (int)(maxWidth / size.Width);
            int lineCount = (int)(2048 / size.Height);

            return charLineCount * lineCount / 2;
        }
    }
}
